package it.unipg.bipod.applicationLogic;

import it.unipg.bipod.dataModel.*;

import java.io.OutputStream;

import com.lowagie.text.*;
import com.lowagie.text.rtf.RtfWriter2;

public abstract class RtfGenerator {

	public static void generaVerbale(DatiVerbale dati, OutputStream outStream) throws ApplicationException {
		// Il documento generato
		Document verbale = new Document();
		
		try {
			// Apre lo stream di scrittura
			RtfWriter2.getInstance(verbale, outStream);			
			verbale.open();
			
			// Estrae i corsi
			DatiVerbale.CorsoInsegnamento[] corsi = dati.getCorsi();
			
			// Scrive il verbale
			for (DatiVerbale.CorsoInsegnamento corso : corsi) {
				// Crea la sezione per il corso di laurea corrente
				Paragraph sezione = new Paragraph();
				
				// Crea il titolo della sezione
				Paragraph titolo = new Paragraph();
				titolo.setFont(FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLD));
				titolo.add(corso.getCorso().getNome());
				sezione.add(titolo);
				
				// Popola la sezione
				for (DatiVerbale.InsegnamentoDocenti insegnamento : corso.getInsegnamenti()) {
					// Paragrafo per l'insegnamento corrente
					Paragraph paragrafoInsegnamento = new Paragraph();
					
					// Nome dell'insegnamento
					Paragraph titoloInsegnamento = new Paragraph();
					titoloInsegnamento.setFont(FontFactory.getFont(FontFactory.TIMES, 14, Font.UNDERLINE));
					titoloInsegnamento.add(insegnamento.getInsegnamento().getNome() + " (cfu: " + insegnamento.getInsegnamento().getCfu() + ")");
					paragrafoInsegnamento.add(titoloInsegnamento);
					
					// Corpo del paragrafo
					Paragraph corpo = new Paragraph();
					corpo.setFont(FontFactory.getFont(FontFactory.TIMES, 12, Font.NORMAL));
					Docente[] docentiRichiedenti = insegnamento.getRichiedenti();
					if (docentiRichiedenti.length == 1)
						// Un solo docente ha fatto richiesta
						corpo.add("E' pervenuta la sola domanda di: ");
					else
						// Hanno fatto richiesta diversi docenti
						corpo.add("Sono pervenute le domande di: ");
					for (Docente docente : docentiRichiedenti) {
						corpo.add(docente.getCognome() + " " + docente.getNome() + ", " + docente.getQualifica());
						corpo.add(" appartenente al settore scientifico disciplinare " + docente.getSsd() + ". ");
					}
					corpo.add("La facoltà unanime, accoglie la domanda e pertanto conferisce l'affidamento " +
							"dell'insegnamento di \"" + insegnamento.getInsegnamento().getNome() + "\" a " +
							insegnamento.getAssegnatario().getCognome() + " " + insegnamento.getAssegnatario().getNome() + ".");
					paragrafoInsegnamento.add(corpo);
					
					// Aggiunge il paragrafo alla sezione
					sezione.add(paragrafoInsegnamento);
				}
				
				// Aggiunge questa sezione al verbale
				verbale.add(sezione);
			}
			
		} catch (DocumentException e) {
			throw new ApplicationException("Errore");
		}
		
		// Chiude lo stream
		verbale.close();
	}
}
